Nom: Juan Alba Maldonado
Curs: DAI 1
Data: 29/5/2007


0.-

Por si acaso (para ver la salida):
SET SERVEROUTPUT ON

Crear enlace a ARTICULOS (conectados como sys):
* Se crea el link: CREATE DATABASE LINK milink CONNECT TO granvino IDENTIFIED BY kk USING 'XE2';
* Se verifica: SELECT * FROM articulos@minlink;

Creo una tabla local igual a la del enlace:
* Se crea igual en la local: CREATE TABLE articulos AS SELECT * FROM articulos@milink;
* Comprobamos su estructura: DESC articulos;
* Comprobamos su contenido: SELECT * FROM articulos;


1.-

	1.1.-

CREATE OR REPLACE FUNCTION valid_depto
(
	v_dept_no IN NUMBER(2)
)
	RETURN BOOLEAN
AS
	CURSOR micursor IS SELECT * FROM depart WHERE dept_no = v_dept_no;
	fila%ROWTYPE;
	valida BOOLEAN;
BEGIN
	OPEN micursor;
	FETCH micursor INTO fila;
	valida := cursor%FOUND;
	CLOSE micursor;
	RETURN valida;
END;
/

	1.2.-

CREATE OR REPLACE PROCEDURE nou_emp
(
	v_emp_no IN NUMBER(4),
	v_apellido IN VARCHAR2(10),
	v_oficio IN VARCHAR2(10) DEFAULT 'EMPLEAT',
	v_dir IN NUMBER(4) DEFAULT 7698,
	v_fecha_alt IN DATE DEFAULT sysdate,
	v_salario IN NUMBER(7) DEFAULT 1000,
	v_comision IN NUMBER(7) DEFAULT 0,
	v_dept_no IN NUMBER(2) DEFAULT 30
)
AS
	valida BOOLEAN DEFAULT FALSE;
BEGIN
	valida := VALID_DEPTNO(v_dept_no);
	IF valida THEN
		INSERT INTO emple (emp_no, apellido, oficio, dir, fecha_alt, salario, comision, dept_no) VALUES (v_emp_no, v_apellido, v_oficio, v_dir, v_fecha_alt, v_salario, v_comision, v_dept_no);
	ELSE
		DBMS_OUTPUT.PUT_LINE('El numero de departament ' || v_dept_no || 'no existeix!');
	END IF;
END;
/

	1.3.-

* Asi no funciona porque da errores por culpa de lo que hay en el START WITH. Habria que hacer
  la consulta a parte e insertar en el START WITH el numero que obtengamos de ella ("START WITH
  numero_obtenido"):

CREATE SEQUENCE misecuencia
START WITH ((SELECT max(emp_no) FROM emple) + 1) -- <- Asi no funciona porque da errores (habria que hacer la consulta a parte e insertar aqui el numero que obtengamos de ella).
MINVALUE 1
MAXVALUE 9999
CYCLE
ORDER
NOCACHE

	1.4.-

* En la consola:
execute noe_emp(misecuencia, 'JOSEP');
* Resultat: 1 fila insertada.

	1.5.-

* En la consola:
execute noe_emp(misecuencia, 'JOSEP', 90 => v_dept_no);
* Resultat: 1 fila insertada.


2.-

	2.1.-

CREATE OR REPLACE PROCEDURE secure_dml
(
	data IN DATE DEFAULT sysdate
)
AS
	dia NUMBER(2) := to_char(data, 'd');
	hora NUMBER(2) := to_char(data, 'hh');
	minuts NUMBER(2) := to_char(data, 'mm');
	hora_be BOOLEAN DEFAULT FALSE;
	dia_be BOOLEAN DEFAULT FALSE;
BEGIN
	IF hora >= 9 AND (hora < 5 OR hora = 5 AND minuts <= 30) THEN
		hora_be := TRUE;
	END IF;
	IF dia >= 1 AND dia <= 5 THEN
		dia_be := TRUE;
	END IF;
	IF hora_be AND dia_be THEN
		DBMS_OUTPUT.PUT_LINE('Sol es pot canviar les dades en hores normals d'oficina');
	END IF;
END;
/

	2.2.-

CREATE OR REPLACE TRIGGER p352e2
INSTEAD OF DELETE OR INSERT OR UPDATE OR DROP OR ALTER OR TRUNCATE
ON ARTICULOS WHEN secure_dml()
FOR EACH ROW
BEGIN
	NULL;
END;
/

	2.3.-

* O una de dos: o se ha de cambiar la hora del sistema o cambiar la linea del TRIGGER del
  ejercicio 1.2 que pone "secure_dml()" poniendo entre parentesis la fecha que queremos
  ("secure_dml(fecha_que_queremos)"). Despues solo queda comprobar si funciona (se debe tener
  cuidado con que codart no exista):

INSERT INTO articulos (codart, descrip, precio, stock, stock_min) VALUEs (1234, 'Descripcion', 123, 789, 1);

* Si se habia cambiado, se vuelve a poner la hora del sistema correctamente.